import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.awt.Color;
/**
 * Write a description of class Jugador here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Jugador extends Actor
{
    /**
     * Act - do whatever the Jugador wants to do. This method is called whenever
     * the 'Act' or 'Run' button gets pressed in the environment.
     */
    private GreenfootImage[] arrIma=new GreenfootImage[11];
    private boolean inmunidadPrincesa;
    private int puntos;
    private int contBalas;
    private int yVel;
    private int balas;
    private boolean jugar;
    private boolean apareceUnaVez;
    /**
     * Constructor
     */
    public Jugador()
    {
        arrIma[0] = new GreenfootImage("c0.gif");
        arrIma[1] = new GreenfootImage("c1.gif");
        arrIma[2] = new GreenfootImage("c2.gif");
        arrIma[3] = new GreenfootImage("c3.gif");
        arrIma[4] = new GreenfootImage("c4.gif");
        arrIma[5] = new GreenfootImage("c1i.gif");
        arrIma[6] = new GreenfootImage("c2i.gif");
        arrIma[7] = new GreenfootImage("c3i.gif");
        arrIma[8] = new GreenfootImage("c4i.gif");
        arrIma[9] = new GreenfootImage("c3a.gif");
        arrIma[10] = new GreenfootImage("psombrilla.gif");
        setImage(arrIma[0]);
        puntos=0;
        inmunidadPrincesa=false;
        jugar=true;
        balas=0;
        apareceUnaVez=false;
    }
    /**
     * Actua solo se realiza miesntras se este jugando una vez que gano ya mo se realiza
     */
    public void act() 
    {
        if(jugar==true)
        {
            MoveWorld world=(MoveWorld)getWorld();
            mueve();
            checaBorde();
            pierdeVida(); 
            caer();
            aumentaPuntos();
            if(getY()>world.getHeight())
            {
                world.decrementaVida();
                world.Perdio();
            }
            cambiaDeNivel();
        }
        else
           if(jugar==false)
                mueveSobrePiso();
    }
    /**
     * Controla el movimiento del jugador
     */
    public void mueve()
    {
        GreenfootImage imagen=getImage();
        MoveWorld mundo=(MoveWorld)this.getWorld();
        Rama rama=(Rama)getOneObjectAtOffset(0,55,Rama.class);
        if(getX()>=0)
        {
            if(rama!=null)
            {
                 yVel=-1;
                 setLocation(getX(),rama.getY()-122);
                 setImage(arrIma[0]);
                 if(Greenfoot.isKeyDown("up")&&getY()>100)
                 {
                     yVel=-15;
                     setImage(arrIma[9]);
                     Greenfoot.playSound("salto2.wav");
                 }
            }
           if(Greenfoot.isKeyDown("right") && getOneObjectAtOffset(30,35,Rama.class)==null)
           { 
                setLocation(getX()+5,getY());
                setImage(arrIma[Greenfoot.getRandomNumber(3)+1]);
            }
            else
                if(Greenfoot.isKeyDown("left") && getOneObjectAtOffset(-30,35,Rama.class)==null)
                {
                    setLocation(getX()-5,getY());
                    setImage(arrIma[Greenfoot.getRandomNumber(3)+5]);
                }
           yVel+=1;
           setLocation(getX(),getY()+yVel);
           if(Greenfoot.isKeyDown("a"))
           {
                setImage(arrIma[10]);
                if(balas>0&&contBalas<=0)
                {
                    mundo.addObject(new Bala(),getX()+30,getY());
                    Greenfoot.playSound("disparo.mp3");
                    balas--;
                    contBalas=20;
                }
            }
            if(contBalas>0)
                contBalas--;
        }
    }
    /**
     * Aumenta el numero de balas este metodo es llamado por la clase sombrilla
     */
    public void setBalas(int unNum)
    {    
        balas=unNum;
    }
    /**
     * Este metodo revisa si llego al borde derecho y coloca al jugador al inicio
     * y a los personajes segun el nivel en el que ese encuentre
     * 
     */
    public void checaBorde()
    {
        MoveWorld mundo=(MoveWorld)this.getWorld();
        if(getX()>=mundo.getWidth()-60)
        {
            setLocation(40,173);   
            inmunidadPrincesa=false;
            getWorld().removeObjects(getWorld().getObjects(Inmunidad.class));
            mundo.apareceMonedas();
            switch(mundo.getCambiaN())
            {   
               case 1: mundo.borraPersonajes();
                        mundo.apareceRanas();
                        mundo.apareceSombrillas();
                        mundo.apareceMonedas();
               break;
               case 2: mundo.borraPersonajes();
                        mundo.apareceRanas();
                        mundo.apareceRegalos();
                        mundo.apareceAves();
                        mundo.apareceSombrillas();
                        mundo.apareceMonedas();
               break;
               case 3:mundo.borraPersonajes();
                      mundo.apareceRanas();
                      mundo.apareceRegalos();
                      mundo.apareceAves();
                      mundo.apareceSombrillas();
                      mundo.apareceMonedas();
                      mundo.apareceArdillas();
               break;
  
           }
        }
    }
    /**
     * Reaparece al jugador en la posicion inical en caso de caer de una rama
     */
    public void caer()
    {
       MoveWorld mundo=(MoveWorld)this.getWorld();
       if(getY()>=mundo.getHeight())
       {
           setLocation(51,203);
          
       }
    }
    /***
    * Aumenta los puntos y los despliega en pantalla
    */
    public void aumentaPuntos()
    {
       if(isTouching(Moneda.class))
       {
           puntos++;  
           Greenfoot.playSound("moneda.mp3");
           removeTouching(Moneda.class);
           MoveWorld mundo=(MoveWorld)this.getWorld();
           Letrero letrero1=mundo.getLetrero();
           int xl=letrero1.getX();
           int yl=letrero1.getY();
           letrero1.despliega(""+puntos,40,Color.DARK_GRAY);
           mundo.addObject(letrero1,xl,yl);
       }
        
    }
    /**
     * Regresa los puntos para que el mundo pueda acceder a ellos
     */
    public int getPuntos()
    {
       return puntos;  
    }
    /**
     * Manda un mensaje al mundo para que cambie de nivel segun los puntos que se lleven
     */
    public void cambiaDeNivel()
    {
        MoveWorld mundo=(MoveWorld)this.getWorld();
        mundo.cambiaNivel();
    }
    /**
     * Decrementa las vidas siempre y cuando la variable de inmunidadPrincesa no este activada
     */
    public void pierdeVida()
    {
          MoveWorld mundo=(MoveWorld)this.getWorld();
          if(!inmunidadPrincesa)
             if(isTouching(Rana.class)|| isTouching(Roca.class)|| isTouching(Ardilla.class)||getY()>=410)  
                   mundo.decrementaVida();
    }
    /**
     * Cambia el estado de esta variable este metodo es llamado por la clase regalo
     */
    public void setInmunidadPrincesa(boolean unEstado)
    {
        inmunidadPrincesa=unEstado;
    }
    /**
     * Se usan para presentar los records solo apareceras en este apartado si tus puntos fueron mayor que el que tenga el mejor 
     * puntaje
     */
    public void setScore()
    {
        if(UserInfo.isStorageAvailable())
        {
            UserInfo myInfo=UserInfo.getMyInfo();
            if(myInfo!=null)
            {
                if(puntos>myInfo.getScore())
                {
                    myInfo.setScore(puntos);
                    myInfo.store();
                }
            }
        }
    }
    /**
     * Se llama este metodo cuando se gana el juego da el efecto de que va caminando
     */
    public void mueveSobrePiso()
    {
        MoveWorld mundo=(MoveWorld)this.getWorld();
        if(getX()<335)
        {
            setLocation(getX()+3,getY());
            setImage(arrIma[Greenfoot.getRandomNumber(3)+1]);
        }
        else
        {
            if(getX()>=335&&apareceUnaVez==false)
            {
                apareceUnaVez=true;
                setImage(arrIma[0]);
                mundo.addObject(new Letrero("CONGRATULATIONS ", 70,Color.BLUE),350, 90);
                mundo.addObject(new Letrero(" YOU WON", 70,Color.BLUE),350, 160);
                mundo.addObject(new Atras(),50,35);}
           }
    
    }
    /**
     * Cambia el estado de la variable jugar
     */
    public void setJugar(boolean unEstado)
    {
        jugar=unEstado;
    }
}

